/**
 * uCharts 工具类
 * @description 提供给uCharts组件使用的工具函数
 */

/**
 * 深拷贝对象
 * @param {Object} obj 需要深拷贝的对象
 * @return {Object} 深拷贝后的对象
 */
export function deepCopy(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  const result = Array.isArray(obj) ? [] : {};
  
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      result[key] = deepCopy(obj[key]);
    }
  }
  
  return result;
}

/**
 * 颜色渐变生成
 * @param {String} startColor 开始颜色 
 * @param {String} endColor 结束颜色
 * @param {Number} step 渐变步数
 * @return {Array} 渐变色数组
 */
export function colorGradient(startColor, endColor, step) {
  // 将 hex 转换为 rgb
  const startRGB = hexToRgb(startColor);
  const endRGB = hexToRgb(endColor);
  
  // 计算R\G\B每一步的差值
  const rStep = (endRGB[0] - startRGB[0]) / step;
  const gStep = (endRGB[1] - startRGB[1]) / step;
  const bStep = (endRGB[2] - startRGB[2]) / step;
  
  // 生成颜色数组
  const colorArray = [];
  for (let i = 0; i < step; i++) {
    // 计算每一步的RGB值
    const r = parseInt(startRGB[0] + rStep * i);
    const g = parseInt(startRGB[1] + gStep * i);
    const b = parseInt(startRGB[2] + bStep * i);
    // 转为RGB颜色
    const color = rgbToHex([r, g, b]);
    colorArray.push(color);
  }
  
  return colorArray;
}

/**
 * hex颜色转rgb颜色
 * @param {String} hex 16进制颜色值
 * @return {Array} RGB颜色数组
 */
export function hexToRgb(hex) {
  let color = hex.toLowerCase();
  
  // 如果是简写（如#fff），转换为完整格式（如#ffffff）
  if (color.length === 4) {
    let colorNew = '#';
    for (let i = 1; i < 4; i++) {
      colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
    }
    color = colorNew;
  }
  
  // 处理十六进制的颜色值
  const colorChange = [];
  for (let i = 1; i < 7; i += 2) {
    colorChange.push(parseInt('0x' + color.slice(i, i + 2)));
  }
  
  return colorChange;
}

/**
 * rgb颜色转hex颜色
 * @param {Array} rgb RGB颜色数组
 * @return {String} HEX颜色
 */
export function rgbToHex(rgb) {
  const r = rgb[0];
  const g = rgb[1];
  const b = rgb[2];
  
  const hex = ((r << 16) | (g << 8) | b).toString(16).padStart(6, '0');
  return '#' + hex;
}

/**
 * 格式化数值，增加千分位分隔符
 * @param {Number} num 需要格式化的数值
 * @return {String} 格式化后的字符串
 */
export function formatNumber(num) {
  if (!num) return '0';
  return num.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
}

/**
 * 格式化小数位
 * @param {Number} num 需要格式化的数值
 * @param {Number} digits 小数位数
 * @return {Number} 格式化后的数值
 */
export function toFixed(num, digits = 2) {
  if (!num) return 0;
  return Number(num.toFixed(digits));
}
